import axios from 'axios';
import { getStore, setStore } from './storage';
import { router } from '../router/index';
import { Message } from 'iview';
import Cookies from 'js-cookie';
import Main from '@/views/Main.vue';
// 统一请求路径前缀
let base = '';
// 超时设定
axios.defaults.timeout = 10000;

axios.interceptors.request.use(config => {
    return config;
}, err => {
    Message.error('请求超时');
    return Promise.resolve(err);
});

// http response 拦截器
axios.interceptors.response.use(response => {
    const data = response.data;

    // 根据返回的code值来做不同的处理(和后端约定)
    switch (data.code) {
        case 401:
            // 未登录 清除已登录状态
            Cookies.set('userInfo', '');
            setStore('accessToken', '');
            router.push('/login');
            break;
        case 403:
            // 没有权限
            if (data.message !== null) {
                Message.error(data.message);
            } else {
                Message.error("未知错误");
            }
            break;
        case 500:
            // 错误
            if (data.message !== null) {
                Message.error(data.message);
            } else {
                Message.error("未知错误");
            }
            break;
        default:
            return data;
    }

    return data;
}, (err) => { // 这里是返回状态码不为200时候的错误处理
    Message.error(err.toString());
    return Promise.resolve(err);
});

export const postRequest = (url, params) => {
    let accessToken = getStore("accessToken");
    return axios({
        method: 'post',
        url: `${base}${url}`,
        data: params,
        transformRequest: [function (data) {
            let ret = '';
            for (let it in data) {
                ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&';
            }
            return ret;
        }],
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'accessToken': accessToken
        }
    });
};

export const uploadFileRequest = (url, params) => {
    let accessToken = getStore('accessToken');
    return axios({
        method: 'post',
        url: `${base}${url}`,
        params: params,
        headers: {
            'accessToken': accessToken
        }
    });
};

export const deleteRequest = (url, params) => {
    let accessToken = getStore('accessToken');
    return axios({
        method: 'delete',
        url: `${base}${url}`,
        params: params,
        headers: {
            'accessToken': accessToken
        }
    });
};

export const getRequest = (url, params) => {
    let accessToken = getStore('accessToken');
    return axios({
        method: 'get',
        url: `${base}${url}`,
        params: params,
        headers: {
            'accessToken': accessToken
        }
    });
};

// 加载菜单
export const initMenu = () => {
    getRequest("/menu/getAllList").then(res => {
        if (res.success === true) {
            // console.log(res)
            let fmtRoutes = formatRoutes(res.result);
            console.log(fmtRoutes)
            Cookies.set('menus', JSON.stringify(fmtRoutes));
        }
    })
}

// 转换路由
export const formatRoutes = (routes) => {
    let fmRoutes = [];
    routes.forEach(r => {
        if (r.parent) {
            let route = {
                path: r.path,
                name: r.name,
                icon: r.icon,
                title: r.title,
                component: Main,
                children: []
            }
            let children = [];
            if (r.children && r.children instanceof Array) {
                children = formatRoutes(r.children);
            }
            route.children = children
            fmRoutes.push(route);
        } else {
            let route = {
                path: r.path,
                name: r.name,
                icon: r.icon,
                title: r.title,
                component: () => import(`@/views/sys/${r.component}.vue`)
                // component(resolve) {
                //     require(['@/views/sys/' + r.component + '.vue'], resolve)
                // }
            }
            fmRoutes.push(route);
        }
    })
    return fmRoutes;
}
